package com.zhaoxi.framework.web;

import com.alibaba.fastjson2.JSON;
import com.github.pagehelper.PageInfo;
import com.zhaoxi.common.constant.HttpStatus;
import com.zhaoxi.common.utils.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 操作消息提醒
 *
 * @author zhaoxi
 */
public class PageData extends HashMap<String, Object> implements Map<String, Object> {
  private static final long serialVersionUID = 1L;

  /**
   * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
   */
  public PageData() {
  }

  /**
   * 初始化一个新创建的 AjaxResult 对象
   *
   * @param code 状态码
   * @param msg  返回内容
   */
  public PageData(int code, String msg) {
    super.put("code", code);
    super.put("msg", msg);
  }

  /**
   * 初始化一个新创建的 AjaxResult 对象
   *
   * @param code 状态码
   * @param msg  返回内容
   * @param data 数据对象
   */
  public PageData(int code, String msg, Object data) {
    super.put("code", code);
    super.put("msg", msg);
    if (StringUtils.isNotNull(data)) {
      super.put("data", data);
    }
  }

  /**
   * 返回成功消息
   *
   * @return 成功消息
   */
  public static PageData success() {
    return PageData.success("操作成功");
  }

  /**
   * 返回成功数据
   *
   * @return 成功消息
   */
  public static PageData success(Object data) {
    return PageData.success("操作成功", data);
  }

  /**
   * 返回成功消息
   *
   * @param msg 返回内容
   * @return 成功消息
   */
  public static PageData success(String msg) {
    return PageData.success(msg, null);
  }

  /**
   * 返回成功消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 成功消息
   */
  public static PageData success(String msg, Object data) {
    return new PageData(HttpStatus.SUCCESS, msg, data);
  }

  /**
   * 返回警告消息
   *
   * @param msg 返回内容
   * @return 警告消息
   */
  public static PageData warn(String msg) {
    return PageData.warn(msg, null);
  }

  /**
   * 返回警告消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 警告消息
   */
  public static PageData warn(String msg, Object data) {
    return new PageData(HttpStatus.WARN, msg, data);
  }

  /**
   * 返回错误消息
   *
   * @return 错误消息
   */
  public static PageData error() {
    return PageData.error("操作失败");
  }

  /**
   * 返回错误消息
   *
   * @param msg 返回内容
   * @return 错误消息
   */
  public static PageData error(String msg) {
    return PageData.error(msg, null);
  }

  /**
   * 返回错误消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 错误消息
   */
  public static PageData error(String msg, Object data) {
    return new PageData(HttpStatus.ERROR, msg, data);
  }

  /**
   * 返回错误消息
   *
   * @param code 状态码
   * @param msg  返回内容
   * @return 错误消息
   */
  public static PageData error(int code, String msg) {
    return new PageData(code, msg, null);
  }


  /**
   * 返回成功消息，并传递返回的list和行数
   */
  public static PageData responses(List list) {
    PageData pd = new PageData();
    pd.put("code",HttpStatus.SUCCESS);
    if (list.size() > 0){
      pd.put("total", new PageInfo(list).getTotal());
      pd.put("msg","查询成功");
      pd.put("data",list);
    } else {
      pd.put("total", 0);
      pd.put("msg","没有查询到数据");
    }
    return pd;
  }


  /**
   * 返回成功消息，并传递返回的list和行数
   */
  public static PageData responses(int row) {
    PageData pd = new PageData();
    if (row > 0){
      pd.put("code",HttpStatus.SUCCESS);
      pd.put("msg","查询成功");
    } else {
      pd.put("code",HttpStatus.WARN);
      pd.put("msg","没有查询到数据");
    }
    return pd;
  }

  /**
   * 是否为成功消息
   *
   * @return 结果
   */
  public boolean isSuccess() {
    return Objects.equals(HttpStatus.SUCCESS, this.get("code"));
  }

  /**
   * 是否为警告消息
   *
   * @return 结果
   */
  public boolean isWarn() {
    return Objects.equals(HttpStatus.WARN, this.get("code"));
  }

  /**
   * 是否为错误消息
   *
   * @return 结果
   */
  public boolean isError() {
    return Objects.equals(HttpStatus.ERROR, this.get("code"));
  }

  /**
   * 方便链式调用
   *
   * @param key   键
   * @param value 值
   * @return 数据对象
   */
  @Override
  public PageData put(String key, Object value) {
    super.put(key, value);
    return this;
  }


  /**
   * * 判断一个字符串是否为空串
   * @param key String
   * @return true：为空 false：非空
   */
  public boolean isEmpty(String key) {
    if (isNull(key)){
      return true;
    }
    String var = this.getString(key);
    if ("".equals(var.trim()) ) {
      return true;
    }
    return false;
  }

  /**
   * * 判断一个对象是否为空
   *
   * @param key Object
   * @return true：为空 false：非空
   */
  public boolean isNull(String key) {
    return this.get(key) == null;
  }

  /**
   * 转成String类型的
   */
  public String getString(String str) {
    String res;
    try {
      res = this.get(str).toString();
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

  /**
   * 转成Long类型的
   */
  public Long getLong(String str) {
    Long res;
    try {
      res = Long.valueOf(this.getString(str));
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

  /**
   * 转成Double类型的
   */
  public double getDouble(String str) {
    Double res;
    try {
      res = Double.valueOf(this.getString(str));
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

  /**
   * 转成list<PageData>类型的
   */
  public List<PageData> getListPd(String str) {
    List<PageData> res;
    try {
      res = (List<PageData>) this.get(str);
      String s = JSON.toJSONString(res);
      res = JSON.parseArray(s, PageData.class);
    } catch (Exception e) {
      res = null;
    }
    return res;
  }
}
